jumpout - SECCON 2023
#SECCON_2023
配布されたバイナリをGhidraで解析すると以下の関数が得られた。
code: c
uint FUN_00101360(uint param_1,uint param_2)
{
long in_FS_OFFSET;
if (*(long *)(in_FS_OFFSET + 0x28) != *(long *)(in_FS_OFFSET + 0x28)) {
/* WARNING: Subroutine does not return */
FUN_001010b0((long)(int)param_2,param_2,7);
}
return param_1 ^ param_2 ^ 0x55 ^ (uint)(byte)(&DAT_00104010)(int)param_2;
}
gdbでこの関数をデバッグすると、param_1にはバイナリ内の定数が、param_2には0~29のインデックスが渡されることがわかった。実際にバイナリ内の定数を用いてこの関数の返り値を計算するとflagが得られた。
code:python
s1 = b'\xf6\xf5\x31\xc8\x81\x15\x14\x68\xf6\x35\xe5\x3e\x82\x09\xca\xf1\x8a\xa9\xdf\xdf\x33\x2a\x6d\x81\xf5\xa6\x85\xdf\x17\x00\x00\x00'
s2 = b'\xf0\xe4\x25\xdd\x9f\x0b\x3c\x50\xde\x04\xca\x3f\xaf\x30\xf3\xc7\xaa\xb2\xfd\xef\x17\x18\x57\xb4\xd0\x8f\xb8\xf4\x23\x00'
print(''.join([chr(s1i ^ s2i ^ i ^ 0x55) for i in range(len(s2))]))